#ifndef THREAD_UTILS_HPP
#define THREAD_UTILS_HPP

#include "common.h"

using namespace std;

// 线程工具类：使用模板创建线程并调用对象的成员函数
class ThreadUtils {
public:
    // 创建线程（无返回值）
    template<typename T, typename F, typename... Args>
    static thread createThread(T* obj, F&& func, Args&&... args);

    // 创建线程（带返回值）
    template<typename T, typename F, typename... Args>
    static auto createThreadWithResult(T* obj, F&& func, Args&&... args) 
        -> future<typename result_of<F(T*, Args...)>::type>;
};

// 模板函数实现（必须在头文件中，因编译器需要看到完整定义）
template<typename T, typename F, typename... Args>
thread ThreadUtils::createThread(T* obj, F&& func, Args&&... args) {
    auto task = bind(forward<F>(func), obj, forward<Args>(args)...);
    return thread(move(task));
}

template<typename T, typename F, typename... Args>
auto ThreadUtils::createThreadWithResult(T* obj, F&& func, Args&&... args) 
    -> future<typename result_of<F(T*, Args...)>::type> {
    return async(launch::async, 
                forward<F>(func), 
                obj, 
                forward<Args>(args)...);
}

#endif // THREAD_UTILS_HPP